package com.projeto.desafio.services;

import java.util.HashMap;
import java.util.List;

import com.projeto.desafio.calculos.Dijkstra;
import com.projeto.desafio.calculos.WeightedGraph;
import com.projeto.desafio.dao.GravaMalhaDadosDAO;
import com.projeto.desafio.entity.Mapa;

public class GerenciaWS {

	/**
	 * @param nomeMapa
	 *            do mapa para gravar
	 * @param origemA do tipo String  
	 *             primeiro ponto
	 * @param origemB
	 *            do segundo ponto
	 * @param distancia
	 *            distancia entre OrigemA e Origem B
	 * @return uma mensagem de susseso ou falha
	 */
	public String gravaRota(String nomeMapa, String origemA, String origemB,
			float distancia) {
		GravaMalhaDadosDAO gravaMalhaDadosDAO = new GravaMalhaDadosDAO();
		String strRetorno = gravaMalhaDadosDAO.gravaRota(nomeMapa, origemA,
				origemB, distancia);

		return strRetorno;
	}

	/**
	 * @param nomeMapa do mapa para consultar
	 * @param origemA  do primeiro ponto para consultar
	 * @param origemB do segundo ponto para consultar
	 * @param autonomia  valor de autonomia do veiculo
	 * @param valorLitro  da distancia entre OrigemA e Origem B
	 * @return o melhor caminho e valor desses dois pontos
	 */
	public String retornaCustoEMelhorRota(String nomeMapa, String origemA,
			String origemB, float autonomia, float valorLitro) {

		GravaMalhaDadosDAO gravaMalhaDadosDAO = new GravaMalhaDadosDAO();
		int total = gravaMalhaDadosDAO.retornaTotalPorMapa(nomeMapa);
		List<String> listaNomes = gravaMalhaDadosDAO
				.retornaListaOrigemMapa(nomeMapa);
		HashMap<String, Integer> mapRotas = new HashMap<>();
		WeightedGraph t = new WeightedGraph(total);
		int i = 0;
		for (String nome : listaNomes) {
			mapRotas.put(nome.toUpperCase(), i);
			t.setLabel(i++, nome.toUpperCase());
		}

		List<Mapa> listaMapa = gravaMalhaDadosDAO.retornaListaMapaModel(nomeMapa);

		for (Mapa mapaModel : listaMapa) {
			t.addEdge(mapRotas.get(mapaModel.getOrigem().toUpperCase()),
					mapRotas.get(mapaModel.getDestino().toUpperCase()),
					(int) mapaModel.getDistancia());
		}

		final int[] pred = Dijkstra.dijkstra(t, mapRotas.get(origemA.toUpperCase()));
		return Dijkstra.printPath(t, pred, mapRotas.get(origemA.toUpperCase()),
				mapRotas.get(origemB.toUpperCase()), autonomia, valorLitro);

		/*
		 * t.setLabel(0, "v0"); t.setLabel(1, "v1"); t.setLabel(2, "v2");
		 * t.setLabel(3, "v3"); t.setLabel(4, "v4"); t.setLabel(5, "v5");
		 */
		/*
		 * t.addEdge(0,1,2); t.addEdge(0,5,9); t.addEdge(1,2,8);
		 * t.addEdge(1,3,15); t.addEdge(1,5,6); t.addEdge(2,3,1);
		 * t.addEdge(4,3,3); t.addEdge(4,2,7); t.addEdge(5,4,3);
		 */

	}
}
